#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "Controller.h"
#include "Config.h"


#ifdef Q_OS_WIN
#include <windows.h>   // 让 AllocConsole()、freopen() 可用
#endif

int main(int argc, char *argv[])
{
// 控制台输出
#ifdef Q_OS_WIN
    AllocConsole();                              // 打开控制台窗口
    freopen("CONOUT$", "w", stdout);             // 重定向 stdout
    freopen("CONOUT$", "w", stderr);             // 重定向 stderr
#endif

    //  关键补丁：手动把 Qt bin 路径加入 PATH
    qputenv("PATH", QByteArray("D:/QT/6.9.1/mingw_64/bin;") + qgetenv("PATH"));
    qputenv("QML2_IMPORT_PATH", "D:/QT6/6.9.1/mingw_64/qml");

    QApplication  app(argc, argv);

    //  创建后端控制类对象
    // 这个 Controller 是你定义的 C++ 类，用于处理串口、数据逻辑等
    Config config;
    Controller controller;
    controller.setConfig(&config);

    //  创建 QML 引擎
    // QQmlApplicationEngine 用于加载和运行 QML 界面
    QQmlApplicationEngine engine;

//     engine.setImportPathList({
//     "D:/QT/6.9.1/mingw_64/qml", // QtCharts 模块
//     "E:/workCode/Project/MyProject/ControlX/cmake-build-debug/qml",
//     "E:/workCode/Project/MyProject/ControlX/cmake-build-debug"
// });

    //  将 C++ 对象暴露给 QML 前端
    // rootContext() 返回 QML 的根上下文，可以通过 setContextProperty 暴露属性或对象
    // "Controller" 是在 QML 里访问该对象的名字
    // &controller 是 C++ 实例的指针
    engine.rootContext()->setContextProperty("Config", &config);
    engine.rootContext()->setContextProperty("Controller", &controller);


    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreationFailed,
        &app,
        []() { QCoreApplication::exit(-1); },
        Qt::QueuedConnection);

    // 添加 QML 模块路径
    engine.load(QUrl(QStringLiteral("qrc:/qt/qml/EvolveUI/Dashboard.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
